package com.yjf.ljr.adapter;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;

import android.content.Context;
import android.view.View;
import android.widget.BaseAdapter;

/**
 * 
 * @author renjunjie
 * @version v1.0
 * @date 2014-8-15
 */
public abstract class BAdapter extends BaseAdapter {
	
	/**
	 * 通过反射初始化控件，要求控件的名字和布局文件名字一致,不一致通过ID注解进行配置
	 * */
	@SuppressWarnings("rawtypes")
	protected void initComponents(Context ctx, View v, Object obj) {
		Class clazz = obj.getClass();
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			Class type = field.getType();
			if (View.class.isAssignableFrom(type)) {
				String idName = field.getName();
				
				// 如果字段上有注解则采用注解的id
				ID idAnnotation = field.getAnnotation(ID.class);
				if (idAnnotation != null) {
					idName = idAnnotation.value();
				}

				View view = v.findViewById(ctx.getResources().getIdentifier(idName, "id", ctx.getPackageName()));
				try {
					field.set(obj, view);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	// 这里必须添加@Retention(RetentionPolicy.RUNTIME)，不然程序运行过程中获取不到注解
	@Retention(RetentionPolicy.RUNTIME)
	@Target(ElementType.FIELD)
	
	// 只能将注解加到方法上
	/**控件上的ID注解*/
	public @interface ID {
		String value();
	}
}
